package com.dyp.oauth2_demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * http://127.0.0.1:8080/.well-known/openid-configuration  获取OAuth服务信息
 * http://127.0.0.1:8080/oauth2/authorize?client_id=my-client&response_type=code&scope=user.info+openid&redirect_uri=http://127.0.0.1:8080/login/oauth2/code/my-client
 * access_token本质是JWT解码后如下
 * {
 *     "sub": "user",
 *     "aud": "my-client",
 *     "nbf": 1747286068,
 *     "scope": [
 *         "user.info",
 *         "openid"
 *     ],
 *     "iss": "http://127.0.0.1:8080",
 *     "exp": 1747293268,
 *     "iat": 1747286068,
 *     "jti": "63165526-ed7d-4a7b-a197-e377b46ea737"
 * }
 *
 * OAuth 2.0（及后续的OAuth 2.1）是一种授权框架，核心解决的是安全委托访问（Secure Delegated Access）问题。
 * 它允许**第三方应用** 在 **不获取用户凭据（如密码）** 的前提下，代表用户访问其存储在另一服务上的受保护资源。
 *
 * OAuth2的典型流程包括以下几个步骤：
 * 1.用户发起请求：用户尝试通过第三方登录或访问资源。
 * 2.重定向到授权服务器：客户端将用户重定向到授权服务器的登录页面
 * 3.用户授权：用户在授权服务器上输入凭据并同意授权。
 * 4.颁发授权码：授权服务器返回一个授权码给客户端。
 * 5.交换访问令牌：客户端使用授权码向授权服务器请求访问令牌。
 * 6.访问资源；客户端使用访问令牌访问资源服务器上的受保护资源。
 *
 * 它定义了四种授权方式，适用于不同的应用场景：
 * 1.授权码模式（AuthorizationCode）：适用于有后端支持的应用，安全性高。
 *   1.1 先http://auth-server/oauth2/authorize获取code
 *   1.2 然后通过code在http://auth-server/oauth2/toke去获取token
 * 2.简化模式（lmplicit Grant）：适用于无后端支持的客户端应用（如单页面应用，SPA）。 OAuth 2.1已经去掉该模式
 * 3.密码模式（Password）：适用于用户信任客户端应用的场景。
 * 4.客户端模式（Client Credentials）：适用于客户端应用访问自己的资源。
 *
 * OAuth通过引入一个授权层，用来分离两种不同的角色：客户端和资源所有者。
 * 资源所有者同意以后，资源服务器可以向客户端颁发令牌。客户端通过令牌，去请求数据
 *
 * 授权码模式 关键点：
 * 前端仅与客户端后端交互，不知道 access_token 的存在。
 * 后端负责令牌的存储、刷新和资源请求代理。
 * PKCE 全称Proof Key for Code Exchange, 在 2015 年发布为 RFC 7636, 我们知道, 授权码模式虽好, 但是它不能给公开的客户端用,
 * 因为公开的客户端没有能力保存好秘钥(client_secret), 所以在此之前, 对于公开的客户端, 只能使用隐式模式和密码模式, PKCE 就是为了解决这个问题而出现的
 *

 * OAuth2.0内置了6个接口地址，如下所示：
 * ./oauth2/authorize：授权端点（核心）,获取token
 * ·/oauth2/token：通过token，获取令牌端点（核心）
 * ·/oauth/confirm_access：用户确认授权提交端点
 * ·/oauth/error：授权服务错误信息端点
 * /oauth/check_token：用于资源服务访问的令牌解析端点
 * /oauth/token_key：提供公有密匙的端点，如果你使用JWT令牌的话
 *
 * 通常可以使用的依赖：
 * .Spring Web
 * .Spring Security
 * .OAuth2 Authorization Server（如果需要自定义授权服务器）
 * .OAuth2 Resource Server（如果需要保护资源）
 * .OAuth2Client（如果需要作为客户端集成）
 */
@SpringBootApplication
public class Oauth2DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(Oauth2DemoApplication.class, args);
	}

}
